home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Floppyshop 2
/
Floppyshop - 2.zip
/
Floppyshop - 2.iso
/
art&graf.ix
/
art-3411
/
dkbtrace
/
dkb.doc
< prev
next >
Wrap
Text File
|
1989-09-11
|
64KB
|
1,452 lines
DKBtrace Ray-Tracer, Amiga/IBM Version 2.0
"It's free, and it's well worth the price!"
This program was written by:
David Buck
22C Sonnet Cres.
Nepean, Ontario
Canada, K2H 8W7
It has been made freely distributable. The author retains the copyright
to the program but authorizes free distribution by BBS'es, networks or
by magnetic media. The distributer may choose to charge for the cost of
the disk but should not sell the software for profit. Non-profit
organizations such as clubs may charge for the software so long as the
price is reasonable (less than $5.00 more than the cost of the disk) and
so long as the buyers are informed that the program is freely
distributable.
The images and data files generated by the raytracer are the property of
the user of the software and may be used for any purpose without
restriction.
The author makes no guarantees or warantees with this program and claims
no responsibility for any damage or loss of time caused by this program.
Bug reports may be sent to the author but the author is under no
obligation to provide bug fixes, features, or any support for this
software.
I would also like to place the following conditions on the use of this
program:
1) that it should not be used as part of any commercial package without
my explicit written consent.
2) if you make any neat and interesting pictures, please send them to
me.
3) If you make any changes to the source code, please let me know. I'd
like to see what you've done.
4) This text file should accompany the program.
I can be reached on the following BBS'es
ATX (613) 526-4141
OMX (613) 731-3419
Mystic (613) 731-0088 or (613) 731-6698
FidoNet 1:163/109.9
Bitnet David_Buck@Carleton.CA
Section 0.1 - Recent Update History:
Version 1.2 First release
Version 2.0 Conversion to the IBM done by Aaron A. Collins
New textures, Specular and Phong highlighting added by
Aaron A. Collins
Triangle, Smooth Triangle, Sphere, Plane support added by
David Buck
RAW, IFF and GIF image mapping added by David Buck and Aaron
Collins
Transparency and Fog added by David Buck
GIF format file reader by Steve Bennett (used with permission)
New Noise and DNoise functions by Robert Skinner
(used with permission)
Aaron Collins can be reached on the following BBS'es
Lattice BBS (708) 916-1200
The Information Exchange BBS (708) 945-5575
Stillwaters BBS (708) 403-2826
AAC: As of July of 1990, there will be a Ray-Trace specific BBS in the
(708) Area Code (Chicago suburbia) for all you Traceaholics out there.
The phone number of this new BBS is (708) 358-5611. I will be Co-Sysop
of that board. There is also a new Ray-Trace and Computer-Generated
Art specific SIG on Compuserve, GO COMART. And now, back to the DOCS...
Version 2.0 includes ANSI-C function prototyping for ALL functions,
TARGA format output file capability, and a reversal of the order of
writing screen data from the original DKB/QRT "RAW" file format. For
IBM's, it has a crude VGA 320x200 by 256 color display rendering
ability. If the image requested is larger than 320x200, every other
pixel horizontally and vertically is dropped from the display to keep it
all on the screen.
Version 2.0 compiles under Turbo-C 2.0 on the IBM P.C. and Lattice C
5.05 on the Amiga. The only file which contains the ANSI extensions is
dkbproto.h, so for non-ANSI compilers, you only need to remove the
declaration of the parameters in the config.h file and the whole thing
should compile. There are several example config.h files for Amiga,
IBM, and Unix. The appropriate one should be copied over CONFIG.H, and
the MAKEFILE should be edited for your particular system and compiler
configuration before compilation.
Version 2.0 has a significant difference from prior releases: Speed!
The new primitives of SPHERE, PLANE, TRIANGLE, etc. greatly speed up
tracing. Another significant speed-up is that world X-Y-Z values beyond
10 Million or so are ignored, and ray tracing beyond that distance will
cease. This produces 2 minor peculiarities:
1) A black stripe at the horizon point of Pre-2.0 scene description
.data files that have "ground" and "sky" planes defined. The
planes were traced out to a much greater "infinity" so this effect
was unnoticeable, prior to version 2.0.
2) Tiny black pixels in the texture, or "Surface Acne".
This is usually caused by rays being refracted or reflected such that
the ray does not happen to hit any object, and eventually becomes black
in color as it gets too far away and gets clipped. This effect can be
minimized by enclosing the scene with distant "walls", "floors", or
placing "ocean floors" beneath water, etc. So far, no scenes have
required placing such planes behind the camera, unless an "environment
map" of sorts is desired. See SKYTEST.DAT for several examples of
spurious distant planes. If your "acne" still doesn't go away, it may
be due to a large pixel sample area and it's accidentally picking a point
which is just inside the primitive being hit. This is a more tricky
problem to solve, and anti-aliasing the image will definitely help if
this sort of thing occurs.
For IBM's, the program PICLAB by the Stone Soup Group offers excellent
image post-processing features and has direct TARGA 16/24/32 file format
compatibility, and will serve to palette map and translate the TARGA
images into .GIF's, etc. The commercial application AUTODESK ANIMATOR
offers a CONVERT utility that also does an excellent job of palette
mapping a TARGA to .GIF format. COLORIX VGA PAINT also offers TARGA
format reading and conversion facilities. Those of you with real TARGA
boards can view the files directly in 16 million colors and are lucky
and should know it!
The Stone Soup Group also produces FRACTINT, the best fractal/Mandelbrot
program available at ANY price (and it too is FREE!) for the PC. I
(AAC) have borrowed their Public Domain .GIF file reading routines for
the Image Map texture. Here is their Copyright Notice from the GIF
Decoder module:
* DECODER.C - An LZW decoder for GIF
* Copyright (C) 1987, by Steven A. Bennett
*
* Permission is given by the author to freely redistribute and include
* this code in any program as long as this credit is given where due.
*
* In accordance with the above, I want to credit Steve Wilhite, who
* wrote the code which this is heavily inspired by...
*
* GIF and 'Graphics Interchange Format' are trademarks (tm) of
* Compuserve, Incorporated, an H&R Block Company.
Section 0.5 - Program Description:
This program is a ray tracer written completely in C. It supports
arbitrary quadric surfaces (spheres, ellipsoids, cones, cylinders,
planes, etc.), constructive solid geometry, and various shading models
(reflection, refraction, marble, wood, and many others). It also has
special-case code to handle spheres, planes, triangles, and smooth
triangles. By using these special primitives, the rendering can be done
much more quickly than by using the more general quadrics.
In order to create pictures with this program, you must describe the
objects in the world. This description is a text file called
"<filename>.data", and <filename> defaults to "object" if not specified.
Normally, such files are difficult to write and to read. In order to
make this task easier, the program contains a two-pass parser to read
the data file. It allows the user to easily create complex worlds from
simple components. Since the parser allows include files, the user may
put the object descriptions into different files and combine them all
into one final image.
This manual is divided into four main sections. The first section
describes the command-line parameters for the program. The second
section describes the syntax and semantics of the description language.
Some sample worlds and their corresponding images are provided on the
disk. The third section details how to display and convert the images
using various postprocesors, and section four has a collection of handy
hints for using the tracer most effectively as well as some quick start
procedures.
Section 1 - Command Line Parameters
This program is designed to be run from the CLI, although it can be run
from the Workbench if desired. From the CLI, the program accepts
various parameters:
-wxxx width of the picture in pixels
(On the Amiga, use 319 for full-sized pictures)
-hxxx height of the picture in pixels
(On the Amiga, use 400 for full-sized pictures)
+v verbose option - print out the scan line number.
-v disable verbose option
+f produce an output file
-f don't produce an output file
If the +f option is used, the ray tracer will produce an
output file of the picture. This output file describes each
pixel with 24 bits (8 bits for red, 8 for green, and 8 for
blue). A post processor (Amiga only) called "DumpToIFF" can
convert this format to hi-res HAM format (320 x 400) making
reasonable choices for the colour registers. For compati-
bility, the format of the dump file is the same as the format
for the QRT ray tracer. With Version 2.0, you can substitute
the "t" character for the "f" character and produce output
files directly in the Truevision (R) TARGA 24 format. This
format is remarkably like the QRT/DKB raw format, so it was
easily done, and allows for a wider range of post-processing
programs to be used. The extension .TGA is normally used for
such files, but any may be chosen.
+d display the picture while tracing
-d don't display the picture while tracing
If the +d option is used, then the picture will be displayed
while the program performs the ray tracing. On the Amiga,
this picture is not as good as the one created by "DumpToIFF"
because it does not try to make optimum choices for the colour
registers. Version 2.0 will produce a display on an IBM-PS/2
compatible VGA/MCGA display in 320x200 x 256 colours if the +d
option is given (Anyone for adding in SVGA resolutions??) but
the same basic caveat is still applicable: A good post-
processor will make better choices of the most popular colors
in the image to map to the display.
+p wait for prompt (beep and pause) before quitting
-p finish without waiting
The +p option makes the program wait for a carriage return
before exiting (and closing the graphics screen). This gives
you time to admire the final picture before destroying it.
-ifilename set the input filename
-ofilename set output filename
If your input file is not "Object.data", then you can use -i
to set the filename. The default output filename will be
"data.display" on Amiga's, and either "data.dis" or "data.tga"
on IBM's, depending on the output file format that is being
used. If you want a different output file name, use the -o
option.
+a[xxx] anti-alias - xxx is an optional tolerance level (default 0.3)
-a don't anti-alias
The +a option enables adaptive anti-aliasing. The number
after the +a option determines the threshold for the anti-
aliasing. If the colour of a pixel differs from its neighbor
(to the left or above) by more than the threshold, then the
pixel is subdivided and super-sampled. The samples are
jittered to introduce noise and make the pictures look better.
If the anti-aliasing threshold is 0.0, then every pixel is
supersampled. If the threshold is 1.0, then no anti-aliasing
is done. Good values seem to be around 0.2 to 0.4.
+x allow early exit by hitting any key (IBM only)
-x lock in trace until finished (IBM only)
On the IBM, the -e option disables the ability to abort the
trace by hitting a key. If you are unusually clumsy or have
CATS that stomp on your keyboard (like I do - AAC :-)), you
may want to use it. If you are writing a file, the system
will recognize ^C at the end of line if BREAK is on (on the
IBM). If you aren't writing a file, you won't be able to
abort the trace until it's done.
This option was meant for big, long late-nite traces that take
ALL night (or longer!), and you don't want them interrupted by
anything less important than a natural disaster such as hur-
ricane, fire, flood, famine, etc.
-bxxx use an output file buffer of xxx kilobytes.
(if 0, flush the file on every line - this is the default)
The -b option allows you to assign large buffers to the output
file. This reduces the amount of time spent writing to the
disk and prevents unnecessary wear (especially for floppies).
If this parameter is zero, then as each scanline is finished,
the line is written to the file and the file is flushed. On
most systems, this operation insures that the file is written
to the disk so that in the event of a system crash or other
catastrophic event, at least part of the picture has been
stored properly on disk.
-sxxx start tracing at line number xxx.
-exxx end tracing at line number xxx.
The -s option is provided for when some natural or unnatural
catastrophe has occurred, and you want to restart the trace at
a given line number after the crash. One is subtracted from
the given line number if anti-aliasing is activated (the prior
line's being computed is required for the anti-aliasing mech-
anism to function properly). It can also be used to re-render
parts of an image (perhaps with anti-aliasing turned on). A
separate utility can then merge the new lines into the old
file. The particularly faint of heart or weak of power supply
may want to batch the image in "strips" of 10-20 lines and
concatenate them later.
-qx rendering quality
The -q option allows you to specify the image rendering
quality. The parameter can range from 0 to 9. The values
correspond to the following quality levels:
0,1 Just show colours. Ambient lighting only.
2,3 Show Diffuse and Ambient light
4,5 Render shadows
6,7 Create surface textures
8,9 Compute reflected, refracted, and transmitted rays.
The default is -q9 (maximum quality) if not specified.
You may specify the default parameters by modifying the file
"trace.def" which contains the parameters in the above format.
This filename contains a complete command line as though you
had typed it in, and is processed before any options supplied
on the command line are recognized.
Section 2 - The Object Description Language
The Object Description Language allows the user to describe the world in
a readable and convenient way.
The language delimits comments by the left and right braces ({ and }).
Nested comments are allowed, but no sane person uses them anyway, right?
The language allows include files to be specified by placing the line:
INCLUDE "filename"
at any point in the input file (Include files may be nested).
Section 2.1 - The Basic Data Types
There are several basic types of data:
Float
Floats are represented by an optional sign (+ or -), some digits, an
optional decimal point, and more digits. It does not support the "e"
notation for exponents. The following are valid floats:
1.0 -2.0 -4 +34
Vector
Vectors are arrays of three floats. They are bracketed by angle
brackets ( < and > ), and the three terms usually represent x, y, and z.
For example:
< 1.0 3.2 -5.4578 >
Colour
A colour consists of a red component, a green component, a blue
component, and possibly an alpha component. All four components are
floats in the range 0.0 to 1.0. The syntax for Colours is the word
"COLOUR" followed by any or all of the RED, GREEN, BLUE or ALPHA
components in any order.
For example:
COLOUR RED 1.0 GREEN 1.0 BLUE 1.0
COLOUR BLUE 0.56
COLOUR GREEN 0.45 RED 0.3 ALPHA 0.3
Alpha is a transparency indicator. If an object's colour contains some
transparency, then you can see through it. If Alpha is 0.0, the object
is totally opaque. If it is 1.0, it is totally transparent.
For those people who spell "Colour" the American way as "Color", the
program also accepts "COLOR" as equivalent to "COLOUR" in all instances.
COLOUR_MAP
For wood, marble, spotted, agate, granite, and gradient texturing, the
user may specify arbitrary colours to use for the texture. This is done
by a colour map or "colour spline". When the object is being textured,
a number between 0.0 and 1.0 is generated which is then used to form the
colour of the point. A Colour map specifies the mapping used to change
these numbers into colours. The syntax is as follows:
COLOUR_MAP
[start_value end_value colour1 colour2]
[start_value end_value colour1 colour2]
...
END_COLOUR_MAP
The value is located in the colour map and the final colour is
calculated by a linear interpolation between the two colours in the
located range.
Section 2.2 - The More Complex Data Types
The data types used to describe the objects in the world are a bit more
difficult to describe. To make this task easier, the program allows
users to describe these types in two ways. The first way is to define
it from first principles specifying all of the required parameters. The
second way allows the user to define an object as a modification of
another object (the other object is usually defined from first
principles but is much simpler). Here's how it works:
You can use the term DECLARE to declare a type of object with a certain
description. The object is not included in the world but it can be used
as a "prototype" for defining other objects, as this basic example
shows:
DECLARE Sphere = QUADRIC
<1.0 1.0 1.0>
<0.0 0.0 0.0>
<0.0 0.0 0.0>
-1.0
END_QUADRIC
To then reference the declaration elsewhere in your source file or in
another included one, and to actually include the object in the world,
you would define the object using object definition syntax, like this:
OBJECT
QUADRIC Sphere
SCALE <20.0 20.0 20.0>
END_QUADRIC
COLOUR White
AMBIENT 0.2
DIFFUSE 0.8
END_OBJECT
The real power of declaration becomes apparent when you declare several
primitive types of objects and then define an object with several
component shapes, using either COMPOSITE methods or the CSG methods
INTERSECTION, UNION, or DIFFERENCE. More on those later. Also, using
the DECLARE keyword can make several objects share a texture without the
need for each object to store a duplicate copy of the same texture, for
more efficient memory usage. Example:
OBJECT { A Hot dog in a Hamburger Bun (?) }
UNION
QUADRIC Sphere
SCALE <20.0, 10.0, 20.0>
END_QUADRIC
QUADRIC Cylinder_X
SCALE <40.0, 20.0, 20.0>
END_QUADRIC
END_UNION
END_OBJECT
Viewpoint
The viewpoint tells the ray tracer the location and orientation of the
camera. The viewpoint is described by four vectors - Location,
Direction, Up, and Right. Location determines where the camera is
located. Direction determines the direction that the camera is
pointed. Up determines the "up" direction of the camera. Right
determines the direction to the right of the camera.
A first principle's declaration of a viewpoint would look like this:
VIEWPOINT
LOCATION < 0.0 0.0 0.0>
DIRECTION < 0.0 0.0 1.0>
UP < 0.0 1.0 0.0 >
RIGHT < 1.0 0.0 0.0>
END_VIEWPOINT
This format becomes cumbersome, however, because the vectors must be
calculated by hand. This is especially difficult when the vectors are
not lined up with the X, Y, and Z axes as they are in the above example.
To make it easier to define the viewpoint, you can define one viewpoint,
then modify the description. For example,
VIEWPOINT
LOCATION < 0.0 0.0 0.0>
DIRECTION < 0.0 0.0 1.0>
UP < 0.0 1.0 0.0 >
RIGHT < 1.0 0.0 0.0 >
TRANSLATE < 5.0 3.0 4.0 >
ROTATE < 30.0 60.0 30.0 >
END_VIEWPOINT
In this example, the viewpoint is created, then translated to another
point in space and rotated by 30 degrees about the X axis, 60 degrees
about the Y axis, and 30 degrees about the Z axis.
Unfortunately, even this is somewhat cumbersome. So, in version 2.0,
you can now specify two more parameters:
SKY <vector>
LOOK_AT <vector>
The SKY keyword tells the viewpoint where the sky is. It tries to keep
the camera's UP direction aligned as closely as possible to the sky.
The LOOK_AT keyword tells the camera to look at a specific point. The
camera is rotated as required to point directly at that point. By
changing the SKY vector, you can twist the camera while still looking
at the same point.
Note that a pinhole camera model is used, so no focus or depth-of-field
effects are supported at this time.
Version 2.0 of the raytracer includes the ability to render fog. To add
fog to a scene, place the following declaration outside of any object
definitions:
FOG
COLOUR ... the fog colour
200.0 ... the fog distance
END_FOG
Shapes
Shapes describe the shape of an object without mentioning any surface
characteristics like colour, lighting and reflectivity. The most
general shape used by this system is called a Quadric Surface. Quadric
Surfaces can produce shapes like spheres, cones, and cylinders. The
easiest way to define these shapes is to include the standard file
"BasicShapes.data" into your program and to transform these shapes
(using TRANSLATE, ROTATE, and SCALE) into the ones you want. To be
complete, however, I will describe the mathematical principles behind
quadric surfaces. Those who are not interested in the mathematical
details can skip to the next section.
A quadric surface is a surface in three dimensions which satisfies the
following equation:
A y**2 + B y**2 + C z**2
+ D xy + E xz + F yz
+ G x + H y + I z + J = 0
(Did you really want to know that? I didn't think so. :-) DKB)
Different values of A,B,C,...J will give different shapes. So, if you
take any three dimensional point and use its x, y, and z coordinates in
the above equation, the answer will be 0 if the point is on the surface
of the object. The answer will be negative if the point is inside the
object and positive if the point is outside the object. Here are some
examples:
X**2 + Y**2 + Z**2 - 1 = 0 Sphere
X**2 + Y**2 - 1 = 0 Cylinder along the Z axis
X**2 + Y**2 + Z = 0 Cone along the Z axis
General quadric surfaces can be defined as follows:
QUADRIC
< A B C >
< D E F >
< G H I >
J
END_QUADRIC
Section 2.3 - Quadric surfaces the easy way
Now that doesn't sound so hard, does it? Well, actually, it does. Only
the hard-core graphics fanatic would define his objects using the
QUADRIC definition directly. Even I don't do it that way and I know how
it works (Well, at least I worked it out once or twice :-) - DKB).
Fortunately, there is an easier way. The file "BasicShapes.data" already
includes the definitions of many quadric surfaces. They are centered
about the origin (0,0,0) and have a radius of 1. To use them, you can
define shapes as follows:
INCLUDE "BasicShapes.data"
QUADRIC
Cylinder_X
SCALE < 50.0 50.0 50.0 >
ROTATE < 30.0 10.0 45.0 >
TRANSLATE < 2.0 5.0 6.0 >
END_QUADRIC
You may have as many transformation lines (scale, rotate, and translate)
as you like in any order. Usually, however, it's easiest to do a scale
first, one or more rotations, then finally a translation. Otherwise,
the results may not be what you expect. (The transformations always
transform the object about the origin. If you have a sphere at the
origin and you translate it then rotate it, the rotation will spin the
sphere around the origin like planets about the sun).
Section 2.4 - Spheres
Since spheres are so common in ray traced graphics, A SPHERE primitive
has been added to the system. This primitive will render much more
quickly than the corresponding quadric shape. The syntax is:
SPHERE <center> radius END_SPHERE
You can also add translations, rotations, and scaling to the sphere.
For example, the following two objects are identical:
OBJECT
SPHERE < 0.0 25.0 0.0 > 10.0 END_SPHERE
COLOR Blue
AMBIENT 0.3
DIFFUSE 0.7
END_OBJECT
OBJECT
SPHERE < 0.0 0.0 0.0 > 1.0
TRANSLATE <0.0 25.0 0.0>
SCALE <10.0 10.0 10.0>
END_SPHERE
COLOR Blue
AMBIENT 0.3
DIFFUSE 0.7
END_OBJECT
Note that Spheres may only be scaled uniformly. You cannot use:
SCALE <10.0 5.0 2.0>
on a sphere. If you need oblate spheroids such as this, use a scaled
quadric "Sphere" shape instead.
Section 2.5 - Planes
Another primitive provided to speed up the raytracing is the PLANE.
This is a flat infinite plane. To declare a PLANE, you specify the
direction of the surface normal to the plane (the UP direction) and the
distance from the origin of the plane to the world's origin. As with
spheres, you can translate, rotate, and scale planes. Examples:
PLANE <0.0 1.0 0.0> -10.0 END_PLANE { A plane in the X-Z axes 10
units below the world origin. }
PLANE <0.0 1.0 0.0> 10.0 END_PLANE { A plane in the X-Z axes 10
units above the world origin. }
PLANE <0.0 0.0 1.0> -10.0 END_PLANE { A plane in the X-Y axes 10
units behind the world origin.}
Section 2.6 - Triangles
In order to make more complex objects than the class of quadrics will
permit, a new primitive shape for triangles has been added. There are
two different types of triangles: flat shaded triangles and smooth
shaded (Phong) triangles.
Flat shaded triangles are defined by listing the three vertices of the
triangle. For example:
TRIANGLE < 0.0 20.0 0.0>
< 20.0 0.0 0.0>
<-20.0 0.0 0.0>
END_TRIANGLE
The smooth shaded triangles use Phong Normal Interpolation to calculate
the surface normal for the triangle. This makes the triangle appear to
be a smooth curved surface. In order to define a smooth triangle,
however, you must supply not only the vertices, but also the surface
normals at those vertices. For example:
SMOOTH_TRIANGLE
{ points surface normals }
< 0.0 30.0 0.0 > <0.0 0.7071 -0.7071>
< 40.0 -20.0 0.0 > <0.0 -0.8664 -0.5 >
<-50.0 -30.0 0.0 > <0.0 -0.5 -0.8664>
END_SMOOTH_TRIANGLE
As with the other shapes, triangles can be translated, rotated, and
scaled.
NOTE: Triangles cannot be used in CSG INTERSECTION or DIFFERENCE types
(described next) since triangles have no clear "inside". The CSG UNION
type works acceptably but with no difference from a COMPOSITE object.
Section 2.7 - Constructive Solid Geometry (CSG)
This ray tracer supports Constructive Solid Geometry in order to make
the object definition abilities more powerful. Constructive Solid
Geometry allows you to define shapes which are the union, intersection,
or difference of other shapes. Unions superimpose the two shapes. This
has the same effect as defining two separate objects, but is simpler to
create and/or manipulate. Intersections define the space where the two
surfaces meet. Differences allow you to cut one object out of another.
CSG Intersections, Unions, and Differences can consist of two or more
shapes. They are defined as follows:
OBJECT
INTERSECTION
QUADRIC
...
END_QUADRIC
QUADRIC
...
END_QUADRIC
QUADRIC
...
END_QUADRIC
END_INTERSECTION
...
END_OBJECT
UNION or DIFFERENCE may be used instead of INTERSECTION. The order of
the shapes doesn't matter except for the DIFFERENCE shapes. For CSG
differences, the first shape is visible and the remaining shapes are cut
out of the first (in reverse order from version 1.2 DIFFERENCE's).
Constructive solid geometry shapes may be translated, rotated, or scaled
in the same way as a Quadric surface. The quadric surfaces making up
the CSG object may be individually translated, rotated, and scaled as
well.
When using CSG, it is often useful to invert an shape so that it's
inside-out. The INVERSE keyword can be used to do this for any SPHERE,
PLANE, or QUADRIC. When INVERSE is used, the "inside" of the object is
flipped to be the "outside". For Planes, "inside" is defined to be "in
the opposite direction to the "normal" or "up" direction.
Note that performing an INTERSECTION between an shape and some other
INVERSE shapes is the same as performing a DIFFERENCE. In fact, the
DIFFERENCE is actually implemented in this way.
Section 2.8 - Objects
There is more to defining an object than just its shape. You must tell
the ray tracer about the properties of the surface like colour, alpha,
reflectivity, refractivity, the index of refraction, and so on. To do
this, you must define Objects.
A typical object definition looks something like this:
OBJECT
QUADRIC Sphere
TRANSLATE < 40.0 40.0 60.0 >
END_QUADRIC
TEXTURE
0.05
END_TEXTURE
AMBIENT 0.3
DIFFUSE 0.7
REFLECTION 0.3
REFRACTION 0.3
IOR 1.05
COLOUR RED 1.0 GREEN 1.0 BLUE 1.0 ALPHA 0.5
END_OBJECT
The following keywords may be used when defining objects:
AMBIENT value
- Ambient light is light that is scattered everywhere in the room.
An object lit only by ambient light will appear to have the same
brightness over the entire surface. The default value is very
little ambient light (0.3). The value can range from 0.0 to 1.0.
DIFFUSE value
- Diffuse light is light coming from a light source that is scattered
in all directions. An object lit only by diffuse light looks like
a rubber ball with a spot light shining on it. The value can range
from 0.0 to 1.0. By default, there is mostly diffuse lighting
(0.7).
BRILLIANCE value
- Objects can be made to appear more metallic by increasing their
brilliance. This controls the tightness of the basic diffuse
illumination on objects and minorly adjusts the appearance of
surface shininess. The default value is 1.0. Higher values from
3.0 to about 10.0 can give objects a somewhat more shiny or
metallic appearance. This is best used in concert with either
SPECULAR or PHONG highlighting.
REFLECTION value
- By setting the reflection value to be non-zero, you can give the
object a mirrored finish. It will reflect all other objects in the
room. The value can range from 0.0 to 1.0. By default there is no
reflection.
REFRACTION value
- By setting the refraction value to be non-zero, the object is made
transparent. Light will be refracted through the object like a
lens. The value can be set between 0.0 and 1.0. There is no
refraction by default.
IOR value
- If the object is refracting light, then the IOR or Index of
Refraction should be set. This determines how dense the object is.
A value of 1.0 will give no refraction. The Index of Refraction
for Air is 1.0, Water is 1.33, glass is 1.5, and diamond is 2.4.
PHONG value
- Controls the amount of Phong Specular Reflection highlighting on
the object. Causes bright shiny spots on the object, the colour of
the light source that is being reflected. The size of the spot is
defined by the value given for PHONGSIZE below. PHONG's value is
typically from 0.0 to 1.0, where 1.0 causes complete saturation of
the object's colour to the light source's colour at the brightest
area (center) of the highlight. There is no PHONG highlighting
given by default.
PHONGSIZE value
- Controls the size of the PHONG Highlight on the object, sort of an
arbitrary "glossiness" factor. Values range from 1.0 (Very Dull)
to 100 (Highly Polished). Default PHONGSIZE is 40 (plastic?) if
not specified. This is simulating the fact that slightly reflect-
ive objects, especially metallic ones, have microscopic facets,
some of which are facing in the mirror direction. The more that
are facing that way, the shinier the object appears, and the
tighter the specular highlights become. Phong measures the average
of facets facing in the mirror direction from the light sources to
the viewer.
SPECULAR value
- Very similar to PHONG Specular Highlighting, but a better model is
used for determining light ray/object intersection, so a more
credible spreading of the highlights occur near the object
horizons, supposedly. PHONG is thus included for mostly academic
reasons, but try them both and you decide which you like better.
This effect is most obvious for light sources behind objects. The
size of the spot is defined by the value given for ROUGHNESS below.
Like PHONG, SPECULAR values are typically from 0.0 to 1.0 for full
saturation. Default is no SPECULAR highlighting.
ROUGHNESS value
- Controls the size of the SPECULAR Highlight on the object, relative
to the object's "roughness". Values range from 1.0 (Very Rough) to
0.001 (Very Smooth). The default value if not specified is 0.05
(Plastic?). The roughness or average directional distribution of
the microfacets is facing in the same direction as the perpen-
dicular surface "normal" cause the most notable reflection of the
highlight to the observer.
COLOUR value
- The colour of an object can be set by using this option. The value
is a colour or a colour constant. For example:
COLOUR RED 1.0 BLUE 0.4
- or -
DECLARE Yellow = COLOUR RED 1.0 GREEN 1.0
...
COLOUR Yellow
TRANSLATE vector
ROTATE vector
SCALE vector
- Objects can be translated, rotated, and scaled just like surfaces.
This feature is included for consistency.
LIGHT_SOURCE
- If the LIGHT_SOURCE keyword is used in the definition of an object,
then the object is included in the list of light sources. It can
light objects and produce shadows. (You should also specify the
COLOUR of the light source). Light sources have a peculiar re-
striction: The light source MUST be TRANSLATED to it's final
position in the scene, so the normal way to define a light source
is a sphere or quadric centered about the origin, then TRANSLATED
to where desired in the final scene. For example:
OBJECT
SPHERE <0.0 0.0 0.0> 2.0 END_SPHERE {could be a quadric, too.}
TRANSLATE <100.0 120.0 40.0>
LIGHT_SOURCE
COLOUR RED 1.0 GREEN 1.0 BLUE 1.0
AMBIENT 1.0
DIFFUSE 0.0
END_OBJECT
TEXTURE
- The texture feature is an experiment into functionally based
modelling. This feature allows you to assign more interesting
colouring schemes to objects. Many procedural surface textures are
provided, and by using different colour maps with them, nearly
infinite permutations are possible. For example, you can make some
object look like wood or marble, etc.
The basic TEXTURE syntax is as follows:
TEXTURE
0.05
WOOD
TURBULENCE 0.2
TRANSLATE < 1.0 2.0 3.0 >
ROTATE < 0.0 10.0 40.0 >
SCALE < 10.0 10.0 10.0 >
END_TEXTURE
The transformations are optional. They allow you to transform the
texture independent of the object itself. If you are doing animation,
then the transformations should be the same as the object
transformations so that the texture follows the object.
The floating-point value given immediately following the texture keyword
is an optional "texture randomness" value, which causes a minor random
scattering of calculated colour values and produces a sort of "dithered"
appearance.
Instead of using WOOD, you may use MARBLE, BOZO, CHECKER, or a handful
of other interesting textures. The WOOD and MARBLE textures are
perturbed by a turbulence function. This makes them look more random
and irregular than they would normally appear. The amount of turbulence
can be changed by the TURBULENCE keyword followed by a number. Values
from 0.1 to 0.3 seem to give the best results. The default is 0.0, or
no turbulence.
Note some of the textures given are coloration textures, such as MARBLE,
WOOD CHECKER, GRANITE, and AGATE. These work with colour maps, and have
default "colour maps" they resort to if none are given. The rest of the
textures available are "surface perturbation" textures, and do not dir-
ectly affect the colour of the object, but rather the surface's apparent
orientation in space. Examples of this are WAVES, RIPPLES, DENTS, BUMPS,
and WRINKLES. Note that any given texture may include up to two actual
textures, one coloration and one surface perturbation choice per
texture. This would allow rippled wood, or dented granite combinations,
etc., but keep in mind that any transformations applied to one texture
(i.e. TRANSLATE or SCALE) will also transform the other one in the same
fashion.
The following textures are available:
CHECKER texturing gives a checker-board appearance. This option works
best on planes. When using the CHECKER texturing, you must specify two
colours immediately following the word CHECKER. These colours are the
colours of alternate squares in the checker pattern. The default
orientation of the CHECKER texture is on an X-Z plane (good for ground
work, etc.) but to use it on an object which has mostly X-Y orientation
(such as a sphere, for instance), you must ROTATE the texture.
To rotate the CHECKER texture onto an X-Y plane:
TEXTURE
CHECKER COLOUR White COLOUR Red
SCALE <10.0 10.0 10.0>
ROTATE <-90.0 0.0 0.0> { Checkers now in the X-Y plane... }
END_TEXTURE
As mentioned above, for coloration textures such as WOOD, MARBLE, and
BOZO, etc., you may change the colouring scheme by using a colour map.
This map allows you to convert numbers from 0.0 to 1.0 (which are
generated by the ray tracer) into ranges of colours. For example, the
default BOZO colouring can be specified by:
TEXTURE
BOZO
COLOUR_MAP
[0.0 0.4 COLOUR White COLOUR White]
[0.4 0.6 COLOUR Green COLOUR Green]
[0.6 0.8 COLOUR Blue COLOUR Blue]
[0.8 1.0 COLOUR Red COLOUR Red]
END_COLOUR_MAP
END_TEXTURE
BOZO texture basically takes a noise function and maps it onto the
surface of an object. This "noise" is defined for every point in space.
If two points are close together, they will have noise values that are
close together. If they are far apart, their noise values will be
fairly random relative to each other.
The easiest way to see how it works is to try it. With a good choice of
colours it produces some of the most realistic looking cloudscapes you
have ever seen. Try a cloud color map such as:
TEXTURE
BOZO
TURBULENCE 1.0 { A blustery day. For a calmer one, try 0.2 }
COLOUR_MAP
[0.0 0.5 COLOUR RED 0.5 GREEN 0.5 BLUE 1.0 {blue to blue}
COLOUR RED 0.5 GREEN 0.5 BLUE 1.0]
[0.5 0.6 COLOUR RED 0.5 GREEN 0.5 BLUE 1.0 {blue to white}
COLOUR RED 1.0 GREEN 1.0 BLUE 1.0]
[0.6 1.001 COLOUR RED 1.0 GREEN 1.0 BLUE 1.0 {white to grey}
COLOUR RED 0.5 GREEN 0.5 BLUE 0.5]
END_COLOUR_MAP
SCALE <800.0 800.0 800.0>
TRANSLATE <200.0 400.0 100.0>
END_TEXTURE
(Check out sunset.dat for a really neat (but slow) sky pattern)
The color map above indicates that for small values of texture, use a
sky blue color solidly until about halfway turbulent, then fade through
to white on a fairly narrow range. As the white clouds get more turb-
ulent and solid towards the center, pull the color map toward grey to
give them the appearance of holding water vapor (like typical clouds).
SPOTTED - Spotted texture is a sort of swirled random spotting of the
colour of the object. If you've ever seen a metal organ pipe you know
about what it looks like (a galvanized garbage can is close...) Play
with this one, it might render a decent cloudscape during a very stormy
day (?). No extra keywords are required. Should work with colour maps.
With small scaling values, looks like masonry or concrete.
AGATE - this texture is similar to Marble, but uses a different turb-
ulence function. The TURBULENCE keyword has no effect, and as such it
is always very turbulent.
GRADIENT - this is a specialized texture that uses approximate local
coordinates of an object to control colour map gradients. This texture
ONLY works with colour maps (one MUST be given!) and has a special <X,
Y, Z> triple given after the GRADIENT keyword, which specifies any (or
all) axes to perform the gradient action on. (Example: a Y gradient
<0.0, 1.0, 0.0> will give an "altitude colour map", along the Y axis).
Values other than 0.0 are taken as 1.0 and others are meaningless. For
smooth repeating gradients, you should use a nearly "circular" colour
map, that is, one in which the first colour value (0.0) is the same as
the last one (1.001) so it "wraps around" and will cause smooth
repeating gradient patterns. Scaling the texture is normally required
to achieve the number of repeating shade cycles you want.
Transformation of the texture is useful to prevent a "mirroring" effect
from either side of the central 0 axes. Here is an example of a
gradient texture which uses a sharp "circular" color mapped gradient
rather than a smooth one, and uses both X and Y gradients to get a
diagonally-oriented gradient. It produces a dandy candy cane texture!
TEXTURE
GRADIENT < 1.0 1.0 0.0 >
COLOUR_MAP
[0.00 0.25 COLOUR RED 1.0 GREEN 0.0 BLUE 0.0
COLOUR RED 1.0 GREEN 0.0 BLUE 0.0]
[0.25 0.75 COLOUR RED 1.0 GREEN 1.0 BLUE 1.0
COLOUR RED 1.0 GREEN 1.0 BLUE 1.0]
[0.75 1.001 COLOUR RED 1.0 GREEN 0.0 BLUE 0.0
COLOUR RED 1.0 GREEN 0.0 BLUE 0.0]
END_COLOUR_MAP
SCALE <30.0 30.0 30.0>
TRANSLATE <30.0 -30.0 0.0>
END_TEXTURE
You may also specify a TURBULENCE value with the gradient to give a
more irregular colour gradient. This may help to do neat things like
fire or coronas.
GRANITE - A colouring texture. This uses a simple 1/f fractal noise
function to give a pretty darn good grey granite texture. Typically
used with small scaling values (2.0 to 5.0). Also looks good with a
little dithering (texture randomness). Should work with colour maps, so
try your hand at pink granite or alabaster!
RIPPLES - As mentioned above, you may optionally specify a surface
perturbation texture which can be used in conjunction with the above
coloration textures. RIPPLES is one example of a surface perturbation
texture. This texture makes the surface look like ripples of water.
The RIPPLES option requires a value to determine how deep the ripples
are:
TEXTURE
WOOD
RIPPLES 0.3
TRANSLATE < 1.0 2.0 3.0 >
ROTATE < 0.0 10.0 40.0 >
SCALE < 10.0 10.0 10.0 >
END_TEXTURE
(In this case, the WOOD, MARBLE, or BOZO, etc. keywords are optional).
If a different colouring is specified (WOOD, MARBLE, or BOZO), then the
COLOUR parameter is ignored (except for light sources where it gives the
light colour or when rendering with a low -q option).
WAVES - Another option that you may want to experiment with is called
WAVES. This works in a similar way to RIPPLES except that it makes waves
with different frequencies. The effect is to make waves that look more
like deep ocean waves. (I haven't done much testing on WAVES, so I can't
guarantee that it works very well).
Both WAVES and RIPPLES respond to a texturing option called PHASE. The
PHASE option allows you to create animations in which the water seems to
move. This is done by making the PHASE increment slowly between frames.
The range from 0.0 to 1.0 gives one complete cycle of a wave.
BUMPS - Approximately the same turbulence function as SPOTTED, but uses
the derived value to perturb the surface normal. This gives the
impression of a "bumpy" surface, random and irregular, sort of like an
orange. After the BUMPS keyword, supply a single floating point value
for the amount of surface perturbation. Values typically range from 0.0
(No Bumps) to 1.0 (Extremely Bumpy). Values beyond 1.0 may do wierd
things.
DENTS - Also a surface normal perturbing texture. Interesting when used
with metallic textures, it gives impressions into the metal surface that
look like dents. A single value is supplied after the DENTS keyword to
indicate the amount of denting required. Values range from 0.0 (No
Dents) to 1.0 (Fairly Dented). Use larger values at your own risk...
Scale the texture to make the pitting more or less frequent.
WRINKLES